filechooserbutton: Fix drag highlight problems
authorMatthias Clasen <mclasen@redhat.com>
Fri, 11 Mar 2016 13:50:38 +0000 (08:50 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 11 Mar 2016 13:51:50 +0000 (08:51 -0500)
This widget is a bit unusual in that it is a box that acts as
the drop target, while the visible content is a child of the box.
Propagate :drop(active) to the child to make the highlight visible.

gtk/gtkfilechooserbutton.c

index dd631bbc33ce39b7ed73bb7bcd4fbd4a07132964..e9e81471b9bdf8fa9ffac1287b7c937743c799e0 100644 (file)
@@ -278,6 +278,8 @@ static gboolean gtk_file_chooser_button_mnemonic_activate  (GtkWidget        *wi
 static void     gtk_file_chooser_button_style_updated      (GtkWidget        *widget);
 static void     gtk_file_chooser_button_screen_changed     (GtkWidget        *widget,
                                                            GdkScreen        *old_screen);
+static void     gtk_file_chooser_button_state_flags_changed (GtkWidget       *widget,
+                                                             GtkStateFlags    previous_state);
 
 /* Utility Functions */
 static GtkIconTheme *get_icon_theme               (GtkWidget            *widget);
@@ -386,6 +388,7 @@ gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class)
   widget_class->style_updated = gtk_file_chooser_button_style_updated;
   widget_class->screen_changed = gtk_file_chooser_button_screen_changed;
   widget_class->mnemonic_activate = gtk_file_chooser_button_mnemonic_activate;
+  widget_class->state_flags_changed = gtk_file_chooser_button_state_flags_changed;
 
   /**
    * GtkFileChooserButton::file-set:
@@ -995,6 +998,27 @@ gtk_file_chooser_button_finalize (GObject *object)
  *  GtkWidget Functions  *
  * ********************* */
 
+static void
+gtk_file_chooser_button_state_flags_changed (GtkWidget     *widget,
+                                             GtkStateFlags  previous_state)
+{
+  GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget);
+  GtkFileChooserButtonPrivate *priv = button->priv;
+  GtkWidget *child;
+
+  if (gtk_widget_get_visible (priv->button))
+    child = priv->button;
+  else
+    child = priv->combo_box;
+
+  if (gtk_widget_get_state_flags (widget) & GTK_STATE_FLAG_DROP_ACTIVE)
+    gtk_widget_set_state_flags (child, GTK_STATE_FLAG_DROP_ACTIVE, FALSE);
+  else
+    gtk_widget_unset_state_flags (child, GTK_STATE_FLAG_DROP_ACTIVE);
+
+  GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->state_flags_changed (widget, previous_state);
+}
+
 static void
 gtk_file_chooser_button_destroy (GtkWidget *widget)
 {